package core

import (
	"errors"
	"strings"

	"github.com/dlclark/regexp2"
)

var InvalidSet0 = []rune{'w', 'W', 'ß', 'ç', 'Ç', ' '}
var InvalidSet1 = []rune{'‘', '’', '‘', '’'} // TODO:
var InvalidSet2 = []rune{'ϛ'}
var InvalidSet3 = []rune{'а', 'с', 'ԁ', 'е', 'һ', 'і', 'ӏ', 'р', 'ԛ', 'ѕ', 'ԝ', 'х', 'у', 'С', 'Ԛ', 'Ѕ', 'Ԝ', 'Ү'}

var (
	ErrCheckInput0 = errors.New("请检查拼写。")
	ErrCheckInput1 = errors.New("请检查是否混淆了气符和引号。")
	ErrCheckInput2 = errors.New("请注意区分στίγμα（ϛ/st）和词末的σίγμα（ς/s）。")
	ErrCheckInput3 = errors.New("请注意区分形似拉丁字母或希腊字母的西里尔字母。")
)

// 仅处理一个单词
func Translate(s string) (translated string, comment []string, debug []string, err error) {
	// 彩蛋
	switch s {
	case "罗念生", "懋德", "古典学", "学脉", "古典学学脉":
		return s, []string{"罗念生（1904年7月12日—1990年4月10日），新中国古典学学脉奠基人、古典学家、翻译家，原名懋德。"}, nil, nil
	case "小物":
		return s, []string{"惟公懋德，克勤小物。（《尚书 • 毕命》）"}, nil, nil
	case "古典学研究", "《古典学研究》":
		return s, []string{"《古典学研究》系中国社会科学院外国文学研究所主办的古典学学术期刊。《古典学研究》以解读中外古典文明的传世经典为主，兼及其他相关研究，打通文史哲的藩篱，旨在促进我国学界对中外古典文明的深入认识，增进中西古典文明互鉴。"}, nil, nil
	}

	// 一　字符检查
	for _, r := range InvalidSet0 {
		if strings.ContainsRune(s, r) {
			err = ErrCheckInput0
			return
		}
	}

	for _, r := range InvalidSet1 {
		if strings.ContainsRune(s, r) {
			err = ErrCheckInput1
			return
		}
	}

	for _, r := range InvalidSet2 {
		if strings.ContainsRune(s, r) {
			err = ErrCheckInput2
			return
		}
	}

	for _, r := range InvalidSet3 {
		if strings.ContainsRune(s, r) {
			err = ErrCheckInput3
			return
		}
	}

	if strings.Contains(strings.ToLower(s), "rh") {
		comment = append(comment, "若为希腊名，请根据原名转写。")
	}

	// 二　希腊字母特殊修改
	s = replaceWithSets(s, ReplaceSetsGkSpecial)
	debug = append(debug, s)

	// 三　大写改小写
	s = replaceWithSets(s, ReplaceSetsUpper2Lower)
	debug = append(debug, s)

	// 四　拉丁语拼写初步修改
	s = replaceWithSets(s, ReplaceSetsLat)
	debug = append(debug, s)

	// 五　古希腊语拼写初步修改
	s = replaceWithSets(s, ReplaceSetsGkLat)
	debug = append(debug, s)

	// 六　涉及音节末尾的唇鼻音的特殊修改
	s = replaceWithSets(s, ReplaceSetsM)
	debug = append(debug, s)

	// 七　循环转写
	s = mapWithSets(s, TheMapSet)
	debug = append(debug, s)

	// 八　结果修正一：可被优化的“×恩”
	s = replaceWithSets(s, ReplaceSetsCorrect1)
	debug = append(debug, s)

	// 九　结果修正二：可被优化的“×厄恩”
	s = replaceWithSets(s, ReplaceSetsCorrect2)
	debug = append(debug, s)

	// 十　结果修正三：半元音以及带分音符的情况
	s = replaceWithSets(s, ReplaceSetsCorrect3)
	debug = append(debug, s)

	// 十一　结果检查和彩蛋
	if strings.HasSuffix(s, "昂") {
		comment = append(comment, "请手动将男性人名最后的“昂”改为“翁”。")
	}

	if c := checkFamous(s); c != "" {
		comment = append(comment, c)
	}

	translated = s
	return
}

var reMap = map[string]*regexp2.Regexp{}

func replaceWithSets(s string, setss [][][2]string) string {
	for _, sets := range setss {
		for _, set := range sets {
			old, new := set[0], set[1]
			if reMap[old] == nil {
				reMap[old] = regexp2.MustCompile(old, regexp2.None)
			}
			s, _ = reMap[old].Replace(s, new, -1, -1)

		}
	}
	return s
}

func mapWithSets(s string, setss [][][2]string) string {
	m := ""
	prev := s
	for len(s) > 0 {
		for _, sets := range setss {
			for _, set := range sets {
				old, new := set[0], set[1]
				if strings.HasPrefix(old, "^") {
					old = strings.TrimPrefix(old, "^")
					if m == "" && strings.HasPrefix(s, old) {
						m = m + new
						s = strings.TrimPrefix(s, old)
						goto next
					}
				} else {
					if strings.HasPrefix(s, old) {
						m = m + new
						s = strings.TrimPrefix(s, old)
						goto next
					}
				}
			}
		}

	next:
		if prev == s {
			// 出现问题，不完整映射
			return prev + m
		}
		prev = s
	}

	return m
}
